/*
 * @Author: Du.M
 * @Date: 2021-06-30 10:54:27
 * @LastEditTime: 2021-08-17 15:57:03
 * @FilePath: \express_basics\utils\user-jwt.js
 */

const jwt = require('jsonwebtoken'); // 引入验证jsonwebtoken模块
const expressJwt = require('express-jwt'); // 引入express-jwt模块
const {
  constans
} = require('../config/config'); // 引入自定义的jwt密钥
const {
  PRIVATE_KEY,
  JWT_EXPIRED
} = constans

// 验证token是否过期
const jwtAuth = expressJwt({
  // 设置密钥
  secret: PRIVATE_KEY,
  // 设置为true表示校验，false表示不校验
  algorithms: ['HS256'],
  //6.0的jwt需要设置算法
  credentialsRequired: true,
  // 自定义获取token的函数
  getToken: (req) => {
    console.log(req.headers.cookie)
    if (req.headers.cookie) {
      const cookieStr = req.headers.cookie || '' // k1=v1;k2=v2;k3=v3
      let token
      cookieStr.split(';').forEach(item => {
        if (!item) {
          return
        }
        const arr = item.split('=')
        const key = arr[0].trim()
        const val = arr[1].trim()
        if (key == 'token') {
          token = val
          return
        }
      })
      return token
    } else if (req.query && req.query.token) {
      return req.query.token
    }
  }
  // 设置jwt认证白名单，比如/api/login登录接口不需要拦截
}).unless({
  path: [
    '/',
    '/api/login/',
    /^\/main\/.*/,
    /^\/invoice\/.*/,
    /^\/public\/.*/

  ]
})

// jwt-token解析
function decode(req) {
  const cookieStr = req.headers.cookie || '' // k1=v1;k2=v2;k3=v3
      let token
      cookieStr.split(';').forEach(item => {
        if (!item) {
          return
        }
        const arr = item.split('=')
        const key = arr[0].trim()
        const val = arr[1].trim()
        if (key == 'token') {
          token = val
          return
        }
      })
  return jwt.verify(token, PRIVATE_KEY);
}

const getToken = (username) => {
  return jwt.sign(
    // payload：签发的 token 里面要包含的一些数据。
    {
      username
    },
    // 私钥
    PRIVATE_KEY,
    // 设置过期时间
    {
      expiresIn: JWT_EXPIRED
    }
  )
}


module.exports = {
  jwtAuth,
  decode,
  getToken
}